package com.itbaizhan.springdemo6.controller;

import com.itbaizhan.springdemo6.domain.Student;
import org.hibernate.validator.constraints.Length;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.validation.constraints.*;
import java.util.List;

//该控制器开启参数校验
@Validated
@Controller
public class TestController {
    //简单数据类型——springboot参数校验
    @RequestMapping("/t1")
    @ResponseBody  //页面不跳转
    //在校验参数前加校验注解，意是字符串不能为空
    public String t1(@NotBlank(message = "用户名不能为空") String username){
        //int i=1/0;
        System.out.println(username);
        return "请求成功";
    }

    @RequestMapping("/t2")
    @ResponseBody
    //@NotBlank在校验参数前加校验注解，意是字符串不能为空
    //简单类型的集合要加@RequestParam
    //http://localhost:8080/t2?username=dfs&age=20&address=bei&address=jing&email=ikj@bai.com
    public String t2(@NotBlank(message = "用户名不能为空") @Length String username,
                     @NotNull @Max(150) @Min(0) Integer age,
                     @NotEmpty @RequestParam List<String> address,
                     @NotBlank @Email String email){

        System.out.println(username);
        System.out.println(age);
        System.out.println(address);
        System.out.println(email);
        return "请求成功";
    }
    //校验对象类型，类上方可以不添加@Validated,在参数前添加@Validated
    //参数校验，对象类型（student实体类为例，在每个属性上方加校验类型）
    @RequestMapping("/t3")
    @ResponseBody
    //在参数前加@Validated  BindingResult : 封装异常信息
    public String t3(@Validated Student student, BindingResult result){
        //判断是否有参数异常
        if(result.hasErrors()){
            //有参数异常
            List<ObjectError> list = result.getAllErrors();
            //遍历所有异常，输出异常信息
            for(ObjectError err:list){
                //强转为字段异常
                FieldError fieldError = (FieldError) list;
                System.out.println(fieldError.getDefaultMessage());
            }
            throw new RuntimeException("参数异常");
        }
        System.out.println(student);
        return "请求成功";
    }

}
/*validation工具可以进行参数校验
SpringBoot自带了validation工具可以从后端对前端传来的参数进行校验，用法如下：

引入validation起步依赖

<!-- 参数校验 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-validation</artifactId>
</dependency>*/

/*当抛出ConstraintViolationException异常后，我们可以使用SpringMVC的异常处理器，也可以使用SpringBoot自带的异常处理机制。

当程序出现了异常，SpringBoot会使用自带的BasicErrorController对象处理异常。该处理器会默认跳转到/resources/templates/error.html页面。*/

/*@NotNull	判断包装类是否为null
@NotBlank	判断字符串是否为null或者是空串(去掉首尾空格)
@NotEmpty	判断集合是否为空
@Length	判断字符的长度(最大或者最小)
@Min	判断数值最小值
@Max	判断数值最大值
@Email	判断邮箱是否合法*/